package javaCode.chapter14.customgeneric;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 徐州城
 * @version 1.0
 * 泛型的继承和通配符
 */
public class GenericExtends {
    public static void main(String[] args) {

        Object o = new String("xx");

        //泛型没有继承性
        //List<Object> list = new ArrayList<String>();

        //举例说明下面三个方法的使用
        List<Object> objList = new ArrayList<>();
        List<String> strList = new ArrayList<>();
        List<A> aList = new ArrayList<>();
        List<B> bList = new ArrayList<>();
        List<C> cList = new ArrayList<>();

        //如果是 List<?> c，可以接收任意的泛型类型
        printCollection1(objList);
        printCollection1(aList);
        printCollection1(bList);
        printCollection1(cList);
        printCollection1(aList);

        //? extends A 表示上限，可以接受A类或A的子类
        //printCollection2(objList);f
        //printCollection2(strList);f
        printCollection2(aList);
        printCollection2(bList);
        printCollection2(cList);

        //? super A 表示下限，可以接受A类A类的父类，不限于直接父类
        printCollection3(objList);//t
        //printCollection3(strList);//f
        printCollection3(aList);//t
        //printCollection3(bList);//f
        //printCollection3(cList);//f

    }

    //说明：List<?> 表示 任意泛型类型都可以接收
    public static void printCollection1(List<?> c){
        for (Object o : c) {//通配符，取出时，就是Object
            System.out.println(o);
        }
    }

    //? extends A 表示上限，可以接受A类或A的子类
    public static void printCollection2(List<? extends A> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }

    //? super A 表示下限，可以接受A类A类的父类，不限于直接父类
    //规定了泛型的下限
    public static void printCollection3(List<? super A> c){
        for (Object o : c) {
            System.out.println(o);
        }
    }
}

class A{}

class B extends A{}

class C extends B{}